#include <iostream>
#include <string>
#include <vector>

/**
 * @brief 字符串分割函数
 * @param str 输入字符串
 * @param sep 分隔符（支持单字符或多字符）
 * @param result 存储分割结果的vector（不会包含空字符串）
 * @return size_t 分割后的有效元素数量
 * @note 特点：
 *     1. 自动跳过连续分隔符产生的空字符串
 *     2. 忽略开头和结尾的分隔符产生的空字符串
 *     3. 支持任意长度的分隔符
 * @example 
 *     split("a.b..c", ".", result) -> ["a", "b", "c"]
 *     split("abc", "b", result)    -> ["a", "c"]
 */
size_t split(const std::string &str, const std::string &sep, std::vector<std::string> &result) 
{
    size_t pos, idx = 0;
    while (idx < str.size()) 
    {
        // 从当前索引位置查找分隔符
        pos = str.find(sep, idx);
        
        // 未找到分隔符时，截取剩余部分并结束
        if (pos == std::string::npos) 
        {
            // 避免添加空字符串（当剩余部分为空时）
            if (idx != str.size()) 
            {
                result.push_back(str.substr(idx));
            }
            break;
        }

        // 处理找到分隔符的情况
        if (pos == idx) 
        {
            // 当前位置就是分隔符：跳过分隔符长度
            idx = pos + sep.size();
            continue;
        }

        // 截取两个分隔符之间的有效内容
        result.push_back(str.substr(idx, pos - idx));
        
        // 更新索引到当前分隔符末尾
        idx = pos + sep.size();
    }
    return result.size();
}

int main() 
{
    std::string str = "...news....music.#.pop...";
    std::vector<std::string> arry;
    int n = split(str, ".", arry);
    
    // 预期输出（空字符串被过滤）：
    // news
    // music
    // #
    // pop
    for (auto &s : arry) {
        std::cout << s << std::endl;
    }
    return 0;
}